package com.ypx.controller;

import com.ypx.common.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * 优化：
 * 1.文件上传路径：配置在配置文件中，动态的获取
 * 2.文件名：通过前端传递过来的文件获取文件名(存在文件被覆盖的风险)|通过UUID随机生成文件名（唯一）
 * 3.文件后缀：通过前端传递过来的文件获取文件后缀
 */
@Slf4j
@RequestMapping("/common")
@Api(tags = "文件上传/下载")
@RestController
public class CommonController {
    @Value("${reggie.upload-path}")
    private String path;

    /**
     * 文件上传
     * @param file
     * @return
     * @throws IOException
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws IOException {
        //注意：上传的文件是一个临时的文件，如果不存储上传完成会立即被删除
        log.info("文件原始名：{}",file.getOriginalFilename());  //eg  001.jpg

        //优化：


        //* 3.文件后缀：通过前端传递过来的文件获取文件后缀
        String originalFilename = file.getOriginalFilename();
        String suffix = ".jpg";
        if (null != originalFilename) {
            suffix = originalFilename.substring(originalFilename.indexOf("."));
        }

        //* 2.文件名：通过前端传递过来的文件获取文件名(存在文件被覆盖的风险)|通过UUID随机生成文件名（唯一）
        String fileName = UUID.randomUUID() + suffix;  //xxx-xx-xx-xxx

        //4.判断目录是否存在  如果不存在需要创建目录，mkdirs()会递归的创建目录
        File dir = new File(path);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        //5.保存上传的文件
        file.transferTo(new File(path + fileName));

        //6.返回结果（文件名称）
        return R.success(fileName);

    }

    /**
     * 文件下载
     * @param name
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException {
        //1.创建一个文件输入流
        FileInputStream fileInputStream = new FileInputStream(path+name);

        //2.通过HttpServletResponse 创建输出流
        ServletOutputStream outputStream = response.getOutputStream();

        //3.输入流数据读写  定义一个数组大小10kb，为了一次读取10kb，如果文件为空那返回的就是-1
        byte[] bytes = new byte[10240];
        while (fileInputStream.read(bytes) != -1) {
            outputStream.write(bytes);
        }

        //4.关闭流
        fileInputStream.close();
        outputStream.close();
    }
}
